﻿using System;
using biz.ritter.javapi.nio;


namespace Nofs.Fuse.Compat
{

    /**
     * This is an adapter that adapts the oldest path-only based compatibility filesystem API (fuse.compat.Filesystem1) to
     * the old filehandle enabled API (fuse.compat.Filesystem2)
     */
    public class Filesystem1ToFilesystem2Adapter : Filesystem2
    {
        Filesystem1 fs1;

        public Filesystem1ToFilesystem2Adapter(Filesystem1 fs1)
        {
            this.fs1 = fs1;
        }

        //
        // Filesystem implementation

        public FuseStat getattr(String path) //throws FuseException
        {
            return fs1.getattr(path);
        }

        public String readlink(String path) //throws FuseException
        {
            return fs1.readlink(path);
        }

        public FuseDirEnt[] getdir(String path) //throws FuseException
        {
            return fs1.getdir(path);
        }

        public void mknod(String path, int mode, int rdev) //throws FuseException
        {
            fs1.mknod(path, mode, rdev);
        }

        public void mkdir(String path, int mode) //throws FuseException
        {
            fs1.mkdir(path, mode);
        }

        public void unlink(String path) //throws FuseException
        {
            fs1.unlink(path);
        }

        public void rmdir(String path) //throws FuseException
        {
            fs1.rmdir(path);
        }

        public void symlink(String from, String to) //throws FuseException
        {
            fs1.symlink(from, to);
        }

        public void rename(String from, String to) //throws FuseException
        {
            fs1.rename(from, to);
        }

        public void link(String from, String to) //throws FuseException
        {
            fs1.link(from, to);
        }

        public void chmod(String path, int mode) //throws FuseException
        {
            fs1.chmod(path, mode);
        }

        public void chown(String path, int uid, int gid) //throws FuseException
        {
            fs1.chown(path, uid, gid);
        }

        public void truncate(String path, long size) //throws FuseException
        {
            fs1.truncate(path, size);
        }

        public void utime(String path, int atime, int mtime) //throws FuseException
        {
            fs1.utime(path, atime, mtime);
        }

        public FuseStatfs statfs() //throws FuseException
        {
            return fs1.statfs();
        }

        public long open(String path, int flags) //throws FuseException
        {
            fs1.open(path, flags);

            // Filesystem1 doesn't support filehandles
            return 0;
        }

        public void read(String path, long fh, ByteBuffer buf, long offset) //throws FuseException
        {
            fs1.read(path, buf, offset);
        }

        public void write(String path, long fh, Boolean isWritepage, ByteBuffer buf, long offset) //throws FuseException
        {
            fs1.write(path, buf, offset);
        }

        public void flush(String path, long fh) //throws FuseException
        {
            // no flush operation in Filesystem1 - ignore
        }

        public void release(String path, long fh, int flags) //throws FuseException
        {
            fs1.release(path, flags);
        }

        public void fsync(String path, long fh, Boolean isDatasync) //throws FuseException
        {
            // no fsync operation in Filesystem1 - ignore
        }
    }

}
